package com.java.advance.aop.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.Proxy;

/**
 * 动态代理
 * 代理工厂类：给多个目标对象生成代理对象
 * Created by yangminghua on 2019/4/4.
 */
public class ProxyFactory {

    //目标对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * @return 目标对象的代理对象
     */
    public Object getProxyInstance() {

        Object proxyInstance = Proxy.newProxyInstance(
                target.getClass().getClassLoader(), //目标对象所使用的类加载器
                target.getClass().getInterfaces(), //目标对象实现的所有接口
                new InvocationHandler() { // 执行代理对象方法时候触发
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        String methodName = method.getName();// 获取当前执行的方法的方法名
                        Object result = method.getReturnType();//方法的返回值
                        if ("save".equals(methodName)) {
                            //直接查找到对应的方法名执行方法
                            result = method.invoke(target, args); //调用目标对象的方法
                        } else {
                            //执行业务方法前调用参数
                            System.out.println("Do something");
                            StringBuilder sb = new StringBuilder("args:[");
                            if (null != args || args.length > 0) {
                                for (int i = 0; i < args.length; i++) {
                                    sb.append("args[").append(i).append("]=");
                                    sb.append(args[i]);
                                }
                                sb.append("]");
                            }
                            //执行业务方法前打印出所有参数
                            result = method.invoke(target, args); //调用目标对象的方法
                            //执行完业务方法后调用
                            System.out.println("提交事务");
                        }

                        return result;
                    }
                });
        return proxyInstance;
    }
}
